% Esta funcion calcula los polos para una plantilla (La salida es el filtro NORMALIZADO! wp=1)
% No es posible modificar el Q, ya que no tendria sentido, por lo tanto
% devuelve el Q.
% Si le entra un n=0 significa que el usuario no especifico el n y la
% funcion calcula el optimo.
% Si le entra un n, se hace el filtro NORMALIZADO con ese n (Puede o no respetar la plantilla y el unico dato necesario sera el Ap)
% Ap y Aa estan en dB.
function [Zero, polos, Q] = filter_butterworth (wp, Ap, wa, Aa, n, n_min, Q, delay_req, filter_type, wpm, wam)

epsilon=sqrt(10^(Ap/10)-1);

if (n == 0)
    switch filter_type
        case 1,
        wan=wa/wp;
        case 2,
        wan=wp/wa;
        case 3,
        wan=(wam-wa)/(wpm-wp);
        case 4,
        wan=(wpm-wp)/(wam-wa);
    end        
    n=ceil(log10(sqrt(10^(Aa/10)-1)/epsilon)/log10(wan));
end
if (Q~=0)
    Q2=0;
    n=0;
    while (Q2 <= Q)
    n=n+1;
    Q2=1/(2*sin(pi/(2*n)));
    end 
    n=n-1;
end
if (n>n_min && n_min~=0)
    n=n_min;
end

polos=zeros(1,n);
Q=zeros(1,n);

tita=pi/n;
radio=1/nthroot(epsilon, n);
    for k=1:n
        polos(k)=radio*exp(1i*(tita*k + pi/2 - tita/2));
        Q(k)=1/(2*sin((k-1)*tita+tita/2));
    end
    
%% analizo la fase en w=1    
% fase=0;
% for k=1:ceil(n/2)
%     sigma_abs=abs(real(polos(k)));
%     w=imag(polos(k));
%     if (w~=0)
%         fase=fase+atan(2*sigma_abs/(sigma_abs^2+w^2-1);
%     else
%         fase=fase+atan(1/sigma_abs);
%     end
% end

% if (delay_req~=0)
% delay=0;
% for k=1:ceil(n/2)
%     sigma_abs=abs(real(polos(k)));
%     w=imag(polos(k));
%     if (w==0)
%         delay=delay+sigma_abs/(1+sigma_abs^2);
%     else
%         aux=sigma_abs^2+w^2-1;
%         delay=delay+1/(aux/(2*sigma_abs)+1/aux);
%     end
% end
% delay
% n
% if (delay>delay_req)
%     if (n>1)
%         [polos, Q]=filter_butterworth (wp, Ap, wa, Aa, n-1, n_min, 0, delay_req);
%     end
% end

Zero=-1;    % definimos -1 para cuando no hay ceros
end 
